home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / listings / v_13_02 / pjp / strstrea < prev   
Encoding:
Text File  |  1995-01-11  |  3.0 KB  |  103 lines

  1. ------------- Listing 1: The header <<strstream>> ------------------
  2.  
  3. // strstream standard header
  4. #ifndef _STRSTREAM_
  5. #define _STRSTREAM_
  6. #include <<istream>>
  7. #include <<ostream>>
  8.         // constants
  9. const int _ALSIZE = 512;    // default allocation size
  10. const int _MINSIZE = 32;    // minimum allocation size
  11.         // class strstreambuf
  12. class strstreambuf : public streambuf {
  13. public:
  14.     enum __Strstate {_Allocated = 1, _Constant = 2,
  15.         _Dynamic = 4, _Frozen = 8, _Noread = 16,
  16.         _Strzero = 0};
  17.     _BITMASK(__Strstate, _Strstate);
  18.     strstreambuf(streamsize _N = 0)
  19.         {_Init(_N); }
  20.     strstreambuf(void *(*_A)(size_t), void (*_F)(void *))
  21.         {_Init(), _Palloc = _A, _Pfree = _F; }
  22.     strstreambuf(char *_G, streamsize _N, char *_P = 0,
  23.         _Strstate _S = _Strzero)
  24.         {_Init(_N, _G, _P, _S); }
  25.     strstreambuf(unsigned char *_G, streamsize _N,
  26.         unsigned char *_P = 0)
  27.         {_Init(_N, (char *)_G, (char *)_P); }
  28.     strstreambuf(const char *_G, streamsize _N)
  29.         {_Init(_N, (char *)_G, 0, _Constant); }
  30.     strstreambuf(const unsigned char *_G, streamsize _N)
  31.         {_Init(_N, (char *)_G, 0, _Constant); }
  32.     virtual ~strstreambuf();
  33.     void freeze(bool = 1);
  34.     char *str()
  35.         {freeze(); return (gptr()); }
  36.     streamsize pcount() const
  37.         {return (pptr() == 0 ? 0 : pptr() - pbase()); } 
  38. #if _HAS_SIGNED_CHAR
  39.     strstreambuf(signed char *_G, streamsize _N,
  40.         signed char *_P = 0)
  41.         {_Init(_N, (char *)_G, (char *)_P); }
  42.     strstreambuf(const signed char *_G, streamsize _N)
  43.         {_Init(_N, (char *)_G, 0, _Constant); }
  44. #endif /* _HAS_SIGNED_CHAR */
  45. protected:
  46.     virtual int overflow(int = EOF);
  47.     virtual int pbackfail(int = EOF);
  48.     virtual int underflow();
  49.     virtual streampos seekoff(streamoff, ios::seekdir,
  50.         ios::openmode = ios::in | ios::out);
  51.     virtual streampos seekpos(streampos,
  52.         ios::openmode = ios::in | ios::out);
  53.     void _Init(int = 0, char * = 0, char * = 0,
  54.         _Strstate = _Strzero);
  55.     void _Tidy();
  56.     _Strstate _Strmode;
  57. private:
  58.     char *_Pendsave, *_Seekhigh;
  59.     int _Alsize;
  60.     void *(*_Palloc)(size_t);
  61.     void (*_Pfree)(void *);
  62.     };
  63. _BITMASK_OPS(strstreambuf::__Strstate)
  64.         // class istrstream
  65. class istrstream : public istream {
  66. public:
  67.     istrstream(const char *_S)
  68.         : istream(&_Sb), _Sb(_S, 0) {}
  69.     istrstream(const char *_S, streamsize _N)
  70.         : istream(&_Sb), _Sb(_S, _N) {}
  71.     istrstream(char *_S)
  72.         : istream(&_Sb), _Sb((const char *)_S, 0) {}
  73.     istrstream(char *_S, int _N)
  74.         : istream(&_Sb), _Sb((const char *)_S, _N) {}
  75.     virtual ~istrstream();
  76.     strstreambuf *rdbuf() const
  77.         {return ((strstreambuf *)&_Sb); }
  78.     char *str()
  79.         {return (_Sb.str()); }
  80. private:
  81.     strstreambuf _Sb;
  82.     };
  83.         // class ostrstream
  84. class ostrstream : public ostream {
  85. public:
  86.     ostrstream()
  87.         : ostream(&_Sb), _Sb() {}
  88.     ostrstream(char *, streamsize, openmode = out);
  89.     virtual ~ostrstream();
  90.     strstreambuf *rdbuf() const
  91.         {return ((strstreambuf *)&_Sb); }
  92.     void freeze(int _F = 1)
  93.         {_Sb.freeze(_F); }
  94.     char *str()
  95.         {return (_Sb.str()); }
  96.     int pcount() const
  97.         {return (_Sb.pcount()); }
  98. private:
  99.     strstreambuf _Sb;
  100.     };
  101. #endif /* _STRSTREAM_ */
  102.  
  103.